
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>SpringBoot中的多环境配置管理 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>SpringBoot中的多环境配置管理 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">为什么在应用开发中需要进行多环境配置？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为开发、测试和生产等不同环境有不同的配置需求，例如数据库连接信息、服务端口和日志级别。通过多环境配置，可以将这些配置分开管理，确保应用在不同环境下的灵活性、一致性和可维护性，避免硬编码带来的混乱。</div>
          </div>
          <div class="card-source">来源: 多环境配置的概述 -> 1. 为什么需要多环境配置？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Spring Boot实现多环境配置的核心机制是什么？它是如何工作的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring Boot的核心机制是 Profiles。它通过为不同环境（如dev、prod）创建特定的配置文件（例如 application-dev.properties, application-prod.properties）来实现。通过在主配置文件中设置 `spring.profiles.active` 属性来指定当前激活的环境，Spring Boot就会自动加载并应用相应环境的配置文件。</div>
          </div>
          <div class="card-source">来源: Spring Boot 中的配置文件管理 -> 4. Profile 和配置文件的切换</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">激活一个特定的Spring Boot Profile（例如 'prod'）有哪三种主要方式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 在配置文件中设置：在 application.properties 或 application.yml 中配置 `spring.profiles.active=prod`。<br>2. 通过命令行参数激活：在启动应用时使用 `--spring.profiles.active=prod` 参数。<br>3. 通过环境变量激活：设置名为 `SPRING_PROFILES_ACTIVE` 的系统环境变量，其值为 `prod`。</div>
          </div>
          <div class="card-source">来源: 使用 Profiles 管理不同环境配置 -> 2.1 定义和激活 Profile</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Spring Boot默认支持哪两种配置文件格式？它们在结构上有何主要区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring Boot默认支持 `application.properties` 和 `application.yml` 两种格式。<br>`application.properties` 是传统的键值对（key=value）格式。<br>`application.yml` 是YAML格式，通过层级缩进表示结构，比 properties 格式更具层次性和可读性，尤其适合表示结构化数据。</div>
          </div>
          <div class="card-source">来源: Spring Boot 中的配置文件管理 -> 1. 配置文件的类型</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当一个配置项同时存在于通用的`application.properties`和特定环境的`application-prod.properties`中时，Spring Boot会如何处理？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">特定环境的配置文件具有更高的优先级。如果激活了 'prod' Profile，那么`application-prod.properties`文件中的配置值将会覆盖`application.properties`文件中的同名配置项。例如，通用配置端口为8080，生产配置为80，则在生产环境下最终生效的端口是80。</div>
          </div>
          <div class="card-source">来源: 使用 Profiles 管理不同环境配置 -> 4. 配置文件的优先级与覆盖</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">除了使用不同的配置文件，如何在Java代码层面根据当前激活的Profile来决定是否加载某个Spring Bean？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以使用`@Profile`注解。将该注解添加到@Configuration类或@Bean方法上，并指定一个或多个Profile名称（如`@Profile("dev")`）。这样，只有当指定的Profile被激活时，被注解的Bean才会被Spring容器创建和加载。</div>
          </div>
          <div class="card-source">来源: 使用 Profiles 管理不同环境配置 -> 3. 使用 @Profile 注解在代码中区分不同环境</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是“配置外部化”？它在Spring Boot应用中有什么重要作用？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">配置外部化是指将应用程序的配置从代码中分离出来，存储在外部位置，如文件、环境变量或配置服务器。它的重要作用是避免将敏感信息（如数据库密码）硬编码到代码中，提高了应用的安全性和灵活性，使得修改配置时无需重新构建和部署应用。</div>
          </div>
          <div class="card-source">来源: Spring Boot 配置的外部化 -> 1. 外部化配置的概念</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">如何使用Jasypt库来保护Spring Boot配置文件中的敏感信息（如数据库密码）？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">首先，使用Jasypt工具和加密密钥对敏感数据进行加密。然后，在配置文件中用`ENC(...)`格式包裹加密后的字符串，例如`spring.datasource.password=ENC(encrypted_password)`。最后，在配置文件或启动参数中提供解密所需的密钥，例如`jasypt.encryptor.password=secretKey`，以便应用启动时能自动解密。</div>
          </div>
          <div class="card-source">来源: 配置文件加密与敏感数据保护 -> 4. Jasypt 配置文件加密</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在Spring Boot的配置加载优先级中，命令行参数、环境变量和`application.properties`文件中的配置，哪一个优先级最高？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">命令行参数的优先级最高。这意味着通过命令行传入的配置项会覆盖来自环境变量和任何`application.properties`文件中的同名配置项。</div>
          </div>
          <div class="card-source">来源: Spring Boot 中的配置文件管理 -> 3. 配置文件的优先级与加载顺序</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
